# !/usr/bin/env python
# -*- coding:utf-8 -*-

import sqlite3
import datetime
import logging


class casedb:
    '''数据库操作，增删改查'''

    def __init__(self):
        '''初始化，连接数据库，建表'''
        try:
            self.connect_db()
            self.connect()
            # 创建模块表
            self.cursor.execute(f"""
                CREATE TABLE IF NOT EXISTS  module (
                    moduleid INTEGER PRIMARY KEY AUTOINCREMENT,--模块编号
                    parent_id INTEGER NOT NULL,--父id
                    level INTEGER,--层级
                    parent_path TEXT,--路径
                    modulename TEXT NOT NULL,--名称
                    status INTEGER,--是否启用 1/0
                    order_num INTEGER--数量
                )""")
            # 创建用例表
            self.cursor.execute("""  
                CREATE TABLE IF NOT EXISTS testcase (  
                    caseid INTEGER PRIMARY KEY AUTOINCREMENT,  --用例编号
                    moduleid INTEGER NOT NULL,  --所属模块
                    title TEXT NOT NULL,  --用例标题
                    preconditions TEXT,  --前置条件
                    step TEXT NOT NULL,  --步骤
                    expect TEXT,  --预期
                    keyword TEXT,  --关键词
                    priority INTEGER,  --优先级
                    types INTEGER,  --用例类型
                    status INTEGER,  --用例状态
                    modificationdate TEXT default CURRENT_TIMESTAMP,  --修改日期
                    counts TEXT,  --暂留
                    remarks TEXT  --备注
                )""")
            # 创建码值表
            self.cursor.execute("""  
                            CREATE TABLE IF NOT EXISTS codes (  
                                id INTEGER PRIMARY KEY,  --编号
                                value TEXT  --值
                            )""")
            # 创建bug表
            self.cursor.execute("""  
                            CREATE TABLE IF NOT EXISTS bug (  
                                bugid INTEGER PRIMARY KEY AUTOINCREMENT,  --编号
                                title TEXT NOT NULL,  --标题
                                types INTEGER ,  --类型--对应码值表code40-49
                                difficulty INTEGER ,  --难度--对应码值表code30-36
                                moduleid INTEGER ,  --所属模块
                                describe TEXT , --描述
                                think TEXT , --思考
                                severity INTEGER  --严重程度--对应码值表code50-53
                            )""")
            # 创建图片表
            self.cursor.execute("""  
                            CREATE TABLE IF NOT EXISTS image (  
                                imageid INTEGER PRIMARY KEY AUTOINCREMENT,  --编号
                                name TEXT NOT NULL,  --名称
                                image_bytes BLOB ,  --图片
                                bugid INTEGER  --所属bug
                            )""")
            self.conn.commit()
            self.over()
            logging.info("[数据库连接成功]")

        except Exception as e:
            logging.error("[create table error]", e)

    def connect_db(self):
        '''连接数据库'''
        self.conn=sqlite3.connect('data/testcaes.db')  # 连接数据库

    def connect(self):
        '''创建游标'''
        self.cursor=self.conn.cursor()  # 创建游标

    def over(self):
        '''关闭连接'''
        self.cursor.close()

    def down_db(self):
        '''关闭数据库'''
        self.conn.close()

    def operate_one(self, sql: str, value: tuple):
        """
        插入或更新单条表记录
        :param sql: insert语句或update语句
        :param value: 插入或更新的值，形如（）
        :return: True表示插入或更新成功
        """
        try:
            self.cursor.execute(sql, value)
            self.conn.commit()
            if 'INSERT' in sql.upper():
                logging.debug("[insert one record success]")
            if 'UPDATE' in sql.upper():
                logging.debug("[update one record success]")
            return True
        except Exception as e:
            logging.error("[insert/update one record error]", e)
            self.conn.rollback()
            return False

    def operate_many(self, sql: str, value: list):
        """
        插入或更新多条表记录
        :param sql: insert语句或update语句
        :param value: 插入或更新的字段的具体值，列表形式为list:[(),()]
        :return: True表示插入或更新成功
        """
        try:
            # 调用executemany()方法
            self.cursor.executemany(sql, value)
            self.conn.commit()
            if 'INSERT' in sql.upper():
                logging.debug("[insert many  records success]")
            if 'UPDATE' in sql.upper():
                logging.debug("[update many  records success]")
            return True
        except Exception as e:
            logging.error("[insert/update many  records error]", e)
            self.conn.rollback()
            return False

    def query_one(self, sql: str, params=None):
        """
        查询单条数据
        :param sql: select语句
        :param params: 查询参数，形如()
        :return: 语句查询单条结果
        """
        try:
            if params:
                self.cursor.execute(sql, params)
            else:
                self.cursor.execute(sql)
            # 调用fetchone()方法
            r=self.cursor.fetchone()
            logging.debug("[select one record success]")
            return r
        except Exception as e:
            logging.error("[select one record error]", e)

    def query_many(self, sql: str, params=None):
        """
        查询多条数据
        :param sql: select语句
        :param params: 查询参数，形如()
        :return: 语句查询多条结果
        """
        try:
            if params:
                self.cursor.execute(sql, params)
            else:
                self.cursor.execute(sql)
            # 调用fetchall()方法
            r=self.cursor.fetchall()
            logging.debug(f"[select many records success]")
            return r
        except Exception as e:
            logging.error("[select many records error]", e)

    def delete_record(self, sql: str):
        """
        删除表记录
        :param sql: 删除记录SQL语句
        :return: True表示删除成功
        """
        try:
            if 'DELETE' in sql.upper():
                self.cursor.execute(sql)
                self.conn.commit()
                logging.debug("[detele record success]")
                return True
            else:
                logging.debug("[sql is not delete]")
                return False
        except Exception as e:
            logging.error("[detele record error]", e)
            return False

    def main(self):
        # 插入数据
        self.operate_one(('INSERT INTO module VALUES (NULL,?,?,?,?,?,?)'), ('1', '1', '0/1', '更多查询', '1', '1'))
        # self.operate_many(('INSERT INTO testcase VALUES (NULL,?,?,?,?,?,?,?,?,?,?,?,?,?)'),[
        #                  ('1', '选择查询日期', '无', '1、打开页面，选择日期，点击查询', '查询出相应日期结果', '日期查询', '', '', '', '', '', '', ''),
        #                     ('1', '选择下拉', '无', '1、打开页面，选择下拉，点击查询', '查询出相应结果', '下拉查询', '', '', '', '', '', '', '')])
        # 更新数据SQL语句
        current_time=datetime.datetime.now()  # 获取当前时间
        update_sql="update testcase set modificationdate=? where caseid=?"
        update_value=(current_time, '2')
        update_values=[(current_time, '1'), (current_time, '3')]
        self.operate_one(update_sql, update_value)  # 一次更新一条数据
        self.operate_many(update_sql, update_values)  # 一次更新多条数据

        # 查询数据
        row=self.query_many(("select * from testcase where moduleid=?"), '1')
        print(row)

        # 删除数据
        delete_sql="delete from module where moduleid = '7'"
        self.delete_record(delete_sql)


if __name__ == '__main__':
    a=casedb()
    a.connect()
    sql='''INSERT INTO testcase VALUES (NULL,?,?,?,?,?,?,?,?,?,?,?,?)'''
    value=(76,"文件上传下载-下载文件验证","","链接下载，可正常打开，内容正确：验证数据一致性，格式一致性，转码正确","正常打开，内容正确","",1,20,10,"2024-01-24 09:01:40","","")
    from time import time
    # t1=time()
    # row=a.query_one(("SELECT bug.bugid,bug.title,(SELECT value FROM codes WHERE id = bug.types AND id BETWEEN 40 AND 49) AS type_value,(SELECT value FROM codes WHERE id = bug.difficulty AND id BETWEEN 30 AND 36) AS difficulty_value FROM  bug"))
    # t2=time()
    #print(f"消耗时间：{t2 - t1:.6f} sec")
    #print(row)

    # 初始化计时器
    total_time=0
    for _ in range(1):
        t1=time()
        # 执行查询
        row=a.operate_one((sql),value)
        t2=time()
        # 计算并累计单次查询时间
        single_query_time=t2 - t1
        total_time+=single_query_time
        print(row)
    print(total_time)

    a.over()
    a.down_db()
